package com.example.myworkmangeruse

import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.work.*
import java.util.concurrent.TimeUnit


class MainActivity : AppCompatActivity() {

    lateinit var updateWorker: WorkRequest
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        updateWorker = OneTimeWorkRequestBuilder<UpdateWorker>()
            .setConstraints(setConstraints())//运行条件
            .setInitialDelay(10, TimeUnit.SECONDS)//发生后 延迟执行
            .addTag("UpdateWorkerTag")//唯一标识符以便 取消工作或 观察其进度。 如果您有一组逻辑相关的工作，您可能还会发现标记这些工作项会很有帮助。标记允许您一起操作一组工作请求。 例如， WorkManager.cancelAllWorkByTag(String) 取消具有特定标签的所有工作请求，并 WorkManager.getWorkInfosByTag(String) 返回可用于确定当前工作状态的 WorkInfo 对象列表。
            .setInputData(workDataOf("IMAGE_URI" to "http://..."))//传参
            .setBackoffCriteria(
                BackoffPolicy.LINEAR,
                OneTimeWorkRequest.MIN_BACKOFF_MILLIS,
                TimeUnit.MILLISECONDS)
            .build()

        /**PeriodicWorkRequestBuilder周期函数 重复间隔必须大于或等于 PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS 15 minutes.
         * 并且弹性间隔必须大于或等于 PeriodicWorkRequest.MIN_PERIODIC_FLEX_MILLIS。5 minutes.*/
        val myUploadWork = PeriodicWorkRequestBuilder<DownloadWorker>(
            1, TimeUnit.HOURS, // repeatInterval (the period cycle)
            15, TimeUnit.MINUTES
        ) // flexInterval
            .build()
        /**下载通知的*/
        val downLoadWork = PeriodicWorkRequestBuilder<DownloadWorker>(16, TimeUnit.MINUTES)
                // Additional configuration
                .build()

        WorkManager.getInstance(this).enqueue(downLoadWork)

        /**开启worker*/
        WorkManager.getInstance(this).enqueue(updateWorker)
//        var workManager = WorkManager.getInstance(this).enqueueUniqueWork("UpdateWorkerName",
//                ExistingWorkPolicy.KEEP,
//                updateWorker as OneTimeWorkRequest)


        /**当UpdateWorker中的状态变化时*/
        WorkManager.getInstance(this).getWorkInfoByIdLiveData(updateWorker.id)
            .observe(this, { it: WorkInfo? ->
                if (it?.state == WorkInfo.State.SUCCEEDED) {
                    Log.d(
                        "TAGtgw变化",
                        "onCreate: " + it.outputData.getString("IMAGE_URI").toString()
                    )
                }
            })


        /**取消和停止工作
        如果您不再需要运行先前排队的工作，您可以要求取消它。工作可以通过其被取消name， id或由tag 与之相关联。*/
//        // by id
//        WorkManager.getInstance(this).cancelWorkById(updateWorker.id)
//        // by name
//        WorkManager.getInstance(this).cancelUniqueWork("UpdateWorkerName")
//        // by tag
//        WorkManager.getInstance(this).cancelAllWorkByTag("UpdateWorkerTag")


    }


    /**3.使用WorkRequest配置任务。通过WorkRequest配置我们的任务何时运行以及如何运行。

    设置任务触发条件。例如，我们可以设置在设备处于充电，网络已连接，且电池电量充足的状态下，才触发我们设置的任务。
     */
    private fun setConstraints(): Constraints {

        val constraints = Constraints.Builder()
//                .setRequiresCharging(true)
//                .setRequiredNetworkType(NetworkType.UNMETERED)
//                .setRequiresBatteryNotLow(true)
            .build()
        return constraints
    }
}